來唷! 今天來了解 HTTP Requests 吧~
HTTP 請求就像是你在網頁上點擊一個連結,然後瀏覽器會向伺服器發送請求,「我想要獲取那個網頁或圖片」。
這是互聯網運作的基礎,沒有它,我們無法瀏覽網頁或查看內容。
HTTP 有不同的方法。
比如,GET 是用來請求資料的,而 POST 則是用來提交資料的。
這讓開發者能夠有效地管理和操作網站上的數據。
了解 HTTP 請求也能幫助你識別安全問題。
普通的 HTTP 請求是明文傳輸的,這意味著資訊容易被竊聽。因此,使用 HTTPS(安全版的 HTTP)來加密資料是非常重要的,這樣可以保護密碼和信用卡號等敏感信息。
當你發送請求後,伺服器會回應一個狀態碼。
比如 200 表示成功,404 表示找不到頁面。
理解這些狀態碼能幫助開發者更好地處理錯誤和調試網站。
在開發 API 時,HTTP 請求是實現各種功能(如創建、讀取、更新和刪除)的基礎。
熟悉 HTTP 請求的結構和方法對於設計高效的 API 很重要。
來看看官方文件怎麼說吧!
Laravel's
Illuminate\Http\Request
class provides an object-oriented way to interact with the current HTTP request being handled by your application as well as retrieve the input, cookies, and files that were submitted with the request.
我理解的意思是:
Laravel 的 Illuminate\Http\Request
類別是一個非常有用的工具,它讓開發者能夠方便地處理應用程式中的 HTTP 請求。當用戶在瀏覽器中發送請求到你的 Laravel 應用時,這個請求會被轉換成一個 Request
物件。開發者可以使用這個物件來檢查請求的各種細節,例如請求的 URL、HTTP 方法,甚至是用戶提交的表單資料。
在 Laravel 中,HTTP 請求的處理主要是透過 Request
物件來進行。
可以使用依賴注入的方式在控制器中獲取請求實例,或使用全局輔助函數 request()
。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* Store a new user.
*/
public function store(Request $request): RedirectResponse
{
// 使用依賴注入的方式
$data = $request->all();
// 或者使用全局輔助函數
$data = request()->all();
}
}
以請求 URL http://example.com/foo/bar
為例
$request->path()
foo/bar
。$request->host()
example.com
。以請求 URL http://example.com/foo/bar?type=phone
為例
$request->url()
/ $request->fullUrl()
$request->url()
url()
方法返回不帶查詢字串的請求 URL。http://example.com/foo/bar
。$request->fullUrl()
fullUrl()
方法返回包含查詢字串的完整 URLhttp://example.com/foo/bar?type=phone
。$request->method()
public function show(Request $request)
{
$path = $request->path(); // 獲取請求路徑
$host = $request->host(); // 獲取主機名
$url = $request->url(); // 獲取不帶查詢字串的 URL
$fullUrl = $request->fullUrl(); // 獲取包含查詢字串的完整 URL
$method = $request->method(); // 獲取請求方法
return response()->json([
'path' => $path,
'host' => $host,
'url' => $url,
'full_url' => $fullUrl,
'method' => $method,
]);
}
Request Headers 像是附加在 HTTP 請求上的一些信息,幫助伺服器了解請求的背景。
例如,這些 Headers 可以告訴伺服器你是誰、你用什麼設備發送 Request 等。
使用 header
方法:
header
方法來獲取特定的 Request Headers。如果這個Headers 不存在,會返回 null
。// 獲取名為 'X-Header-Name' 的 Headers
// 如果不存在,返回 null
$value = $request->header('X-Header-Name');
// 獲取 Headers,並設定預設值為 'default'
// 如果不存在,返回 'default'
$value = $request->header('X-Header-Name', 'default');
使用 hasHeader
方法:
// 檢查 Headers 是否存在
if ($request->hasHeader('X-Header-Name')) {
// Headers 存在,可以進行後續處理
}
使用 bearerToken
方法:
// 獲取 Bearer Token
// 如果不存在,返回空字串
$token = $request->bearerToken();
獲取發送請求的客戶端的 IP 位址。
這在許多應用場景中都非常有用,例如安全檢查、訪問限制等。
使用 ip
方法:可以獲取發送請求的客戶端的 IP 位址。
// 獲取客戶端 IP 位址
$ipAddress = $request->ip();
使用 ips
方法:如果應用程式使用了代理,並且你想獲取所有經過的 IP 位址,可以使用這個方法。會返回一個數組,其中包括所有轉發的 IP 位址。
// 獲取所有客戶端 IP 位址
$ipAddresses = $request->ips();
安全提示: IP 位址應該被視為不受信任的輸入。因為用戶可以輕易地修改他們的 IP 位址,這些資訊應僅用於參考或日誌記錄,而不應依賴於它們來進行安全性決策。
檢索所有輸入數據
檢索所有數據:使用 all()
方法可以獲取所有傳入請求的輸入數據,返回一個陣列。
$input = $request->all();
使用 collect()
方法獲取所有數據作為集合。
$input = $request->collect();
檢索特定子集:使用 collect('users')
可以獲取特定的輸入子集。
$request->collect('users')->each(function (string $user) {
// ...
});
檢索特定輸入值
基本檢索:使用 input()
方法來獲取特定的輸入值,並可在第二個參數設置預設值。
$name = $request->input('name', 'Sally');
陣列輸入:對於包含陣列的表單,使用「dot」表示法來訪問。
$name = $request->input('products.0.name');
$names = $request->input('products.*.name');
檢索所有輸入作為關聯陣列:不帶參數調用 input()
方法可獲取所有輸入值。
$input = $request->input();
從查詢字串中檢索:使用 query()
方法僅從查詢字串中獲取值
$name = $request->query('name', 'Helen');
處理 JSON 請求:當請求為 JSON 格式時,可以通過 input()
方法訪問 JSON 數據,使用「dot」表示法來訪問。
$name = $request->input('user.name');
獲取字串 string()、整數 integer()、布林值 boolean()、日期 date() 等:
$name = $request->string('name')->trim(); //獲取字串
$perPage = $request->integer('per_page'); //獲取整數
$archived = $request->boolean('archived'); //獲取布林值
$birthday = $request->date('birthday'); //獲取日期
動態屬性訪問:可以通過動態屬性直接訪問請求中的輸入值。
$name = $request->name;
只獲取特定鍵的數據:使用 only()
和 except()
方法來獲取部分數據。
$input = $request->only(['username', 'password']);
$input = $request->except(['credit_card']);
方法名稱 | 說明 |
---|---|
has |
確認請求中是否存在特定值。 |
hasAny |
確認請求中是否存在任一指定值。 |
whenHas |
如果請求中存在特定值,執行給定的閉包。 |
filled |
確認請求中是否存在且不是空字串的值。 |
isNotFilled |
確認請求中是否缺少某個值或該值為空字串。 |
anyFilled |
如果任何指定的值不是空字串,則返回 true。 |
whenFilled |
如果請求中存在且不是空字串的值,執行給定的閉包。 |
missing |
確認請求中是否缺少特定鍵。 |
whenMissing |
如果請求中缺少特定鍵,執行給定的閉包。 |
可以通過 $request->cookie('cookie_name')
獲取請求中的 cookie。
public function getCookie(Request $request)
{
$cookieValue = $request->cookie('user_session');
return response()->json([
'cookie' => $cookieValue,
]);
}
參考資料
踏著身心靈的塔羅腳步,轉向技術與邏輯的工程師之路,就藉由塔羅日抽來紀錄今日的學習與生活吧!
寶劍三:在寫的當天,是颱風假的第三天,放假在家就能好好沉澱,跟自己對話,整理思緒
Be who you are right now.
做好你現在的角色。
—《Toy Story 4》